import cv2
import numpy as np
import matplotlib.pyplot as plt

def _show_results(original_array, edges_x):
    # 显示结果
    plt.figure(figsize=(10, 5))

    plt.subplot(1, 2, 1)
    plt.imshow(original_array, cmap='gray')
    plt.title('原始数组')
    plt.axis('off')

    plt.subplot(1, 2, 2)
    plt.imshow(edges_x, cmap='gray')
    plt.title('X 轴 Prewitt 边缘检测结果')
    plt.axis('off')

    plt.tight_layout()
    plt.show()
def gradient_x(arr):
    """
    计算输入图像在 X 轴方向上的梯度值。每个像素的梯度值表示该像素相对于其左侧像素的差值。

    参数:
    image (np.ndarray): 输入的二维 numpy 数组，可以是灰度图像或者其他数值矩阵。

    返回:
    np.ndarray: 与输入图像形状相同的二维 numpy 数组，包含 X 轴方向的梯度值。第一列的梯度值为 0，因为其左侧没有像素。
    """
    # 初始化梯度数组
    gradient = np.zeros_like(arr)
    # 使用向量化操作计算梯度
    gradient[:, 1:] = arr[:, 1:] - arr[:, :-1]
    return gradient

if __name__ == "__main__":
    # 使用自定义数组进行测试
    test_array = np.array([[80, 160, 120, 80, 40, 0, 80, 160],
                           [80, 160, 120, 80, 40, 0, 80, 160],
                           [80, 160, 120, 80, 40, 0, 80, 160],
                           [80, 160, 120, 80, 40, 0, 80, 160],
                           [80, 160, 120, 80, 40, 0, 80, 160],])

    # 应用 X 轴方向的 Prewitt 算子
    edges_x = gradient_x(test_array)

    # 显示结果
    print("新数据\n", edges_x)
    #_show_results(test_array, edges_x)